
from datetime import datetime
import matplotlib.pyplot as plt
import akshare as ak  # 升级到最新版
import pandas as pd
import mplfinance as mpf


# 解决中文乱码

plt.rcParams["font.sans-serif"] = ["STHeiti"]

plt.rcParams["axes.unicode_minus"] = False

def kline(symbol, start_time, end_time, stock_name):
    try:
        print(f"获取股票数据: {symbol}, 时间范围: {start_time} 至 {end_time}")
        # 利用 AKShare 获取股票的后复权数据，这里只获取前 6 列
        stock_hfq_df = ak.stock_zh_a_hist(symbol, adjust="hfq").iloc[:, :6]
        print(f"获取到的原始数据形状: {stock_hfq_df.shape}")

        # 处理字段命名
        stock_hfq_df.columns = [
            'date',
            'open',
            'close',
            'high',
            'low',
            'volume',
        ]
        # 把 date 作为日期索引
        stock_hfq_df.index = pd.to_datetime(stock_hfq_df['date'])
        stock_hfq_df = stock_hfq_df[start_time:end_time]
        print(f"筛选后的数据形状: {stock_hfq_df.shape}")
        
        # 检查是否有数据
        if stock_hfq_df.empty:
            print(f"警告: 在指定时间范围内没有找到数据: {start_time} 至 {end_time}")
            return
            
        stock_hfq_df[['open', 'close', 'high', 'low', 'volume']] = stock_hfq_df[['open', 'close', 'high', 'low', 'volume']].astype(float)

        print("数据处理完成，前5行数据:")
        print(stock_hfq_df.head())
        
        # 创建一个marketcolors对象,并设置颜色参数
        marketcolors = mpf.make_marketcolors(up='r', down='g', volume='inherit')

        # 创建一个style对象,并将marketcolors对象传递给它
        style = mpf.make_mpf_style(marketcolors=marketcolors, edgecolor='k', rc={'font.family': 'STHeiti'})

        print("开始绘制K线图...")
        # 添加图表 - 使用保存图片的方式确保图表生成
        fig, axes = mpf.plot(stock_hfq_df, type='candle', style=style, title=stock_name + "K线图",
                ylabel="价格",
                ylabel_lower="成交量",
                mav=(5, 10, 20), volume=True, show_nontrading=False, returnfig=True)    
        # 显示图表
        plt.show()
        print("图表显示完成")
    except Exception as e:
        print(f"发生错误: {e}")
        import traceback
        traceback.print_exc()


if __name__ == '__main__':
    # 设置matplotlib后端，确保图形能够显示
    import matplotlib
    # 尝试使用不同的后端
    try:
        matplotlib.use('TkAgg')  # 尝试使用TkAgg后端
    except:
        try:
            matplotlib.use('Qt5Agg')  # 尝试使用Qt5Agg后端
        except:
            try:
                matplotlib.use('Agg')  # 使用Agg后端（不显示图形，但可以保存）
            except Exception as e:
                print(f"无法设置matplotlib后端: {e}")
    
    print("当前使用的matplotlib后端:", matplotlib.get_backend())
    kline("603883", "2024-01-01", "2024-04-26", "海力股份")